import {isElectron} from './platform'
import wfc from "./wfc/client/wfc";

export default class Config {
    // 调试用
    static ENABLE_AUTO_LOGIN = true;
    // 是否支持多人音视频通话
    static ENABLE_MULTI_VOIP_CALL = true;
    // 是否支持1对1音视频通话
    static ENABLE_SINGLE_VOIP_CALL = true;
    // 打开voip调试模式时，voip window不会自动关闭，方便分析控制台日志，需要手动关闭。
    static ENABLE_VOIP_DEBUG_MODE = false;

    static DEFAULT_PORTRAIT_URL = '';
    static DEFAULT_GROUP_PORTRAIT_URL = ''
    static DEFAULT_ORGANIZATION_PORTRAIT_URL = '';
    static DEFAULT_DEPARTMENT_PORTRAIT_URL = '';
    // 默认缩略图，200 x200，#d3d3d3
    static DEFAULT_THUMBNAIL_URL = ''


    // 如果需要支持音视频通话功能，必须全站使用https(包括app server和im server) + wss，
    // WebSockets over SSL/TLS，启用https时，一定要配置为true；不启用https，一定要为false
    // 置为true时，请确保 IM SERVER 支持https访问。IM SERVER本身不能处理https请求，一般是通过在IM SERVER前面加上nginx之类的负载均衡器来实现https支持
    static USE_WSS = true;

    // ROUTE请求端口，默认是80；配置https时，请修改为其他端口，如443等
    static ROUTE_PORT = 443;

    // 是否关闭日志，web和小程序有效
    static DISABLE_LOG = false;

    // APP SERVER的地址，启用https时，APP SERVER也需要支持https
    // 默认的app server使用端口是8888
    static APP_SERVER = 'https://app.wildfirechat.net';

    // 组织结构服务地址，如果没有部署组织结构服务，或者不需要组织结构的话，可置为 null
    // 组织结构项目：https://github.com/wildfirechat/organization-platform 或 https://gitee.com/wfchat/organization-platform
    static ORGANIZATION_SERVER = 'https://org.wildfirechat.cn';
    // 野火二维码 scheme，不要修改，如果需要修改的话，所有端都需要一起修改
    static QR_CODE_PREFIX_PC_SESSION = "wildfirechat://pcsession/";

    // turn server 配置，可以添加多个
    // !!! 我们提供的服务仅供用户测试和体验，为了保证测试可用，我们会不定期的更改密码. !!!
    // 上线时，请一定要切换为你们自己部署的服务
    // 格式: [uri, 用户名, 密码]，可以添加多个
    static ICE_SERVERS = [['turn:turn.wildfirechat.net:3478', 'wfchat', 'wfchat1']];
    static LANGUAGE = 'zh_CN';

    static MESSAGE_ROAMING = 1;


    /**
     * web/wx 端有效
     * 配置是否开启漫游消息通知，即连接过程中，收到的漫游消息，也对上层进行消息通知
     * 如果开启的话，需要注意一下问题：
     * 1. 此时消息回执状态不对
     * 2. 这时候，不应当刷新 UI，需等待连接状态切换为connected之后，再进行刷新
     */
    static ENABLE_ROAMING_MESSAGE_RECEIVING_NOTIFICATION = false;

    /**
     * web/wx 端有效
     * 配置是否开启透传漫游消息通知
     */
    static ENABLE_ROAMING_TRANSPARENT_MESSAGE_RECEIVING_NOTIFICATION = false;

    /**
     * web/wx 端有效
     * 配置收到透传消息时，是否生成对应的会话
     */
    static ENABLE_GENERATE_CONVERSATION_FOR_TRANSPARENT_MESSAGE = false;


    // 配置clientId的生成策略，可选0，1，2；默认0
    // 0 clientId存储于内存，每次刷新网页，都会随机生成新的clientId
    // 1 clientId存储于sessionStorage，每个session对应一个clientId，刷新网页时，clientId不会变化；但打开新的tab页面，或者重启浏览器等，会重新生成
    // 2 clientId存储于localStorage，和域名绑定，每个域名，对应一个clientId，重启浏览器等，不会变化，会导致同一个浏览器，不能同时登录多个不同的账号
    // token是和clientId绑定的，当选策略1和2的时候，应用层可选择将上次成功连接的userId和token持久化，当用户进行刷新网页等操作时，可以直接用持久化的userId和token进行连接；而不用重新进行扫码登录
    // 选2时，支持web端快速登录
    static CLIENT_ID_STRATEGY = 1;

    static SDK_PLATFORM_WINDOWS = 3;
    static SDK_PLATFORM_OSX = 4;
    static SDK_PLATFORM_WEB = 5;
    static SDK_PLATFORM_WX = 6;

    // 向服务端发送ping的间隔，单位是秒。没有特殊需求，不建议修改
    static KEEP_ALIVE_INTERNAL = 180;

    /**
     * 配合{@link wfc.onForeground}使用，切换到前台时，如果多少时间没有活动，将进行重连，单位是秒
     * 需要大于{@link KEEP_ALIVE_INTERNAL}
     * 没有特殊需求，不建议修改
     */
    static KEEP_ALIVE_TIMEOUT = 200;

    // html5 audio 标签不能播放amr格式的音频，需要将amr格式转换为mp3格式
    // 本服务传入amr音频文件的地址，将音频文件转换为mp3格式，并以application/octet-stream的格式返回
    // 如果语音消息很多，建议使用cdn
    static AMR_TO_MP3_SERVER_ADDRESS = Config.APP_SERVER + '/amr2mp3?path=';

    // 发送消息超时时间，超时之后，认为当前连接已不可用，将进行重连，单位是秒。没有特殊需求不，不建议修改
    static SEND_MESSAGE_TIMEOUT = 20;

    // 会话过期时间，表示一个会话，自己不再参与之后，多久会过期。会话列表不展示已过期的会话；单位是天
    static CONVERSATION_EXPIRE_TIME = 30;
    // 文件传输助手ID
    static FILE_HELPER_ID = 'wfc_file_transfer';
    // 是否将用户信息、群组信息、频道信息、聊天室信息持久化
    static ENABLE_INFO_PERSISTENCE = false;

    // 登录时，每个会话最多加载多少条未读消息
    static MAX_TO_LOAD_UNREAD_COUNT_PER_CONVERSATION = 99;

    /**
     * 允许重新编辑多长时间内的撤回消息，单位是秒
     */
    static RECALL_REEDIT_TIME_LIMIT = 60;

    // 允许主动加入多人音视频通话
    static ENABLE_MULTI_CALL_AUTO_JOIN = false;

    // 需要专业版 im-server 才支持，是否打开语音对讲功能，和对讲机类似的功能，不是发送语音消息
    static ENABLE_PTT = false;

    static getWFCPlatform() {
        if (isElectron()) {
            if (window.process && window.process.platform === 'darwin') {
                // osx
                return 4;
            } else {
                // windows
                return 3;
            }

        } else {
            // web
            return 5;
        }
    }

    static config(options) {
        Object.keys(options).forEach(key => {
            Config[key] = options[key];
        });
    }

    /**
     * 网络地址重定向
     *
     * 仅当双网环境时，需要特殊处理，默认原样返回
     *
     * @param {string} url
     * @return {string} newUrl
     */
    static urlRedirect(url) {
        if (!url) {
            return url;
        }
        // 示例代码
        // 双网环境时，将媒体文件地址切到备选网络
        // if (Config.isUseBackupAddress()) {
        //     url = url.replace('oss.xxxx.com', '192.168.2.19');
        // }
        return url;
    }

    /**
     * 双网环境时，判断是否是备选网络
     * @return {boolean}
     */
    static isUseBackupAddress() {
        //示例代码
        let host = wfc.getHost();
        if (host === '192.168.2.169'/* backupHost */) {
            return true;
        }
        return false;
    }

    /**
     * 表情 base 路径
     * @return {string}
     */
    static emojiBaseUrl() {
        // 表情的 baseUrl，一定要求以 / 结尾
        let emojiBaseUrl = 'https://static.wildfirechat.net/twemoji/assets/';
        // 实例代码
        // 双网环境时，将表情地址切换到备选网络
        // if (Config.isUseBackupAddress()) {
        //     emojiBaseUrl = 'https://192.168.2.169/twemoji/assets/';
        // }
        return emojiBaseUrl;
    }

    /**
     * 动态表情 base 路径
     * @return {string}
     */
    static stickerBaseUrl() {
        // 动态表情的 baseUrl，一定要求以 / 结尾
        let stickerBaseUrl = 'https://static.wildfirechat.net/sticker/';
        // 实例代码
        // 双网环境时，将动态表情地址切换到备选网络
        // if (Config.isUseBackupAddress()) {
        //     stickerBaseUrl = 'https://192.168.2.169/sticker/';
        // }
        return stickerBaseUrl;
    }

    static validate() {
        if (Config.APP_SERVER === 'https://app.wildfirechat.net') {
            console.warn("APP SERVER 配置为野火官方，如果需要连接自行部署的IM Server，请修改为说部署的app server")
        }

        console.log(`当前配置信息:
                    app server: ${Config.APP_SERVER}
                    use wss: ${Config.USE_WSS}
                    route port: ${Config.ROUTE_PORT}`)

        if (!Config.APP_SERVER.startsWith("http")) {
            throw new Error('配置错误, Config.APP_SERVER 必须是完整的http地址');
        }

        if (Config.USE_WSS) {
            console.warn('已启用WSS，请确认服务端已配置支持https，配置方法请参考：https://docs.wildfirechat.cn/faq/web/https.html');
        }
        if (Config.APP_SERVER.startsWith('https:') && !Config.USE_WSS){
            throw new Error('https 站点，不能使用 ws，请配置wss, 配置方法请参考：https://docs.wildfirechat.cn/faq/web/https.html');
        }
        if (Config.USE_WSS && Config.ROUTE_PORT !== 443) {
            console.warn(`配置使用WSS连接时，默认端口是443，但目前配置是${Config.ROUTE_PORT}，请确认!!`);
        }

        if (!Config.USE_WSS && Config.ROUTE_PORT !== 80) {
            console.warn(`配置使用WS连接时，默认端口是80，但目前配置是${Config.ROUTE_PORT}，请确认!!`);
        }
    }
}

Config.validate();
